package com.ruibang.glass.portal.util;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.ruibang.glass.portal.domain.Tree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BuildTree {

    public static <T> Tree<T> build(List<Tree<T>> nodes) {

        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

        for (Tree<T> children : nodes) {
            String pid = children.getParentId();
            if (!checkTopNode(pid, nodes)) {
                topNodes.add(children);
                continue;
            }

            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);
                    continue;
                }
            }

        }

        Tree<T> root = new Tree<T>();
        root.setId("-1");
        root.setParentId("");
        root.setHasParent(false);
        root.setChildren(true);
        root.setChecked(true);
        root.setChildren(topNodes);
        root.setText("顶级节点");
        Map<String, Object> state = new HashMap<String, Object>();
        state.put("opened", true);
        root.setState(state);
        return root;
    }

    public static <T> List<Tree<T>> buildList(List<Tree<T>> nodes, String idParam) {
        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

        for (Tree<T> children : nodes) {

            String pid = children.getParentId();
            if (pid == null || idParam.equals(pid)) {
                topNodes.add(children);

                continue;
            }

            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);

                    continue;
                }
            }

        }
        return topNodes;
    }


    /***
     * 寻找子节点以及上层所有父节点树
     * @param nodes
     * @param childId
     * @param <T>
     */
    public static <T> Tree<T> buildParentTree(List<Tree<T>> nodes, String childId) {
        List<Tree<T>> newNodes = new ArrayList<>();
        getParentTree(nodes, childId, newNodes);

        if (CollectionUtils.isNotEmpty(newNodes)) {
            return build(newNodes);
        }

        return null;
    }

    /**
     * 获取父级节点列表
     *
     * @param nodes
     * @param childId
     * @param newNodes
     * @param <T>
     * @return
     */
    private static <T> void getParentTree(List<Tree<T>> nodes, String childId, List<Tree<T>> newNodes) {
        for (Tree<T> node : nodes) {
            if (childId.equals(node.getId())) {
                newNodes.add(node);
                node.setChildren(new ArrayList<>());
                getParentTree(nodes, node.getParentId(), newNodes);
                break;
            }
        }
    }

    public static <T> boolean checkTopNode(String pid, List<Tree<T>> nodes) {
        boolean flag = false;
        for (Tree<T> node : nodes) {
            if (pid.equals(node.getId())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

}